#include "client.h"

int dealCommand(const int sockfd, const char *username, const char *passwd) {

	// 定义TLV结构体
	tlvPacket_t tlv;
	memset(&tlv, 0, sizeof(tlv));

	// 初始化聊天头
	char cHeadName[4096] = {0};
	strcpy(cHeadName, username);
	static char cHead[4096] = {0};
	// 第一次加/， 后面传的都有/了
	if (strlen(cHead) == 0) {
		cHeadName[strlen(cHeadName)] = '/';
	}
	strcat(cHeadName, cHead);

	printf("> %s: ", cHeadName);
	fflush(stdout);

	char buffer[4096] = {0};
	char command[4096] = {0};
	char parameter[4096] = {0};
	char strtokBuffer[4096] = {0};

	// 获取stdin命令和参数
	fgets(buffer, sizeof(buffer), stdin);

	// 去除最后一个换行符
	if (buffer[strlen(buffer) -1] == '\n') {
		buffer[strlen(buffer) -1] = 0;
	}

	// 复制客户端输入
	memcpy(strtokBuffer, buffer, sizeof(buffer));
	const char delimiters[] = " "; // 截断依据

	// 截取命令
	char *token = strtok(strtokBuffer, delimiters);
	memcpy(command, token, strlen(token));

	// 截取参数
	token = strtok(NULL, delimiters);
	//printf("file = %s\n", token);
	if (token != NULL) {
		memcpy(parameter, token, strlen(token));
	}

	char content[4096] = {0}; // 接收内容
	int mark = 0; // 接受标志

	// 日志记录
	LOG(username, command);

	if (strcmp(command, "cd") == 0) {
		// 如果cd后没有参数
		if (strlen(parameter) == 0) {
			printf("Invalid command: cd!\n");
			return -1;
		}

		// 发送命令
		tlv.type = CD;
		tlv.length = strlen(parameter);
		memcpy(tlv.value, parameter, tlv.length);
		send(sockfd, &tlv, sizeof(tlv.type) + sizeof(tlv.length) +
		     tlv.length, MSG_NOSIGNAL);

		// 接受标志
		recv(sockfd, &mark, sizeof(int), MSG_WAITALL);
		if (mark == -1) {
			printf("cd false!\n");
			return -1;
		}

		// 接收路径
		recv(sockfd, &tlv.type, sizeof(commandType_t), MSG_WAITALL);
		recv(sockfd, &tlv.length, sizeof(int), MSG_WAITALL);
		recv(sockfd, tlv.value, tlv.length, MSG_WAITALL);
		memset(cHead, 0, sizeof(cHead));
		memcpy(cHead, tlv.value, tlv.length);
	} else if (strcmp(command, "ls") == 0) {

		// 发送命令
		tlv.type = LS;
		tlv.length = strlen(parameter);
		send(sockfd, &tlv, sizeof(tlv.type) + sizeof(tlv.length) +
		     tlv.length, MSG_NOSIGNAL);

		// 接受标志
		recv(sockfd, &mark, sizeof(int), MSG_WAITALL);
		if (mark == -1) {
			printf("ls false!\n");
			return -1;
		}

		// 接受内容
		recv(sockfd, &tlv.type, sizeof(commandType_t), MSG_WAITALL);
		recv(sockfd, &tlv.length, sizeof(int), MSG_WAITALL);
		//printf("length pass\n");
		if (tlv.length == 0) {
			return 0;
		}
		recv(sockfd, tlv.value, tlv.length, MSG_WAITALL);
		//printf("value pass\n");
		memcpy(content, tlv.value, tlv.length);
		//printf("memcpy pass\n");

		printf("%s\n", content);

	} else if (strcmp(command, "tree") == 0) {

		// 发送命令
		tlv.type = TREE;
		tlv.length = strlen(parameter);
		send(sockfd, &tlv, sizeof(tlv.type) + sizeof(tlv.length) +
		     tlv.length, MSG_NOSIGNAL);

		// 接受标志
		recv(sockfd, &mark, sizeof(int), MSG_WAITALL);
		if (mark == -1) {
			printf("tree false!\n");
			return -1;
		}

		// 接受内容
		recv(sockfd, &tlv.type, sizeof(commandType_t), MSG_WAITALL);
		recv(sockfd, &tlv.length, sizeof(int), MSG_WAITALL);
		//printf("length pass\n");
		if (tlv.length == 0) {
			return 0;
		}
		recv(sockfd, tlv.value, tlv.length, MSG_WAITALL);
		//printf("value pass\n");
		memcpy(content, tlv.value, tlv.length);
		//printf("memcpy pass\n");

		printf("%s\n", content);

	} else if (strcmp(command, "pwd") == 0) {
		printf("%s\n", cHeadName);
	}

	else if (strcmp(command, "mkdir") == 0) {

		// 如果mkdir后没有参数
		if (strlen(parameter) == 0) {
			printf("Invalid command: mkdir!\n");
			return -1;
		}

		// 发送命令
		tlv.type = MKDIR;
		tlv.length = strlen(parameter);
		memcpy(tlv.value, parameter, tlv.length);
		send(sockfd, &tlv, sizeof(tlv.type) + sizeof(tlv.length) +
		     tlv.length, MSG_NOSIGNAL);

		// 接受标志
		recv(sockfd, &mark, sizeof(int), MSG_WAITALL);
		if (mark == -1) {
			printf("mkdir false\n");
			return -1;
		}
	}

	else if (strcmp(command, "rmdir") == 0) {

		// 如果rmdir后没有参数
		if (strlen(parameter) == 0) {
			printf("Invalid command: rmdir!\n");
			return -1;
		}

		// 发送命令
		tlv.type = RMDIR;
		tlv.length = strlen(parameter);
		memcpy(tlv.value, parameter, tlv.length);
		send(sockfd, &tlv, sizeof(tlv.type) + sizeof(tlv.length) +
		     tlv.length, MSG_NOSIGNAL);

		// 接受标志
		recv(sockfd, &mark, sizeof(int), MSG_WAITALL);
		if (mark == -1) {
			printf("rmdir false\n");
			return -1;
		}
	}

	else if (strcmp(command, "remove") == 0) {

		// 如果remove后没有参数
		if (strlen(parameter) == 0) {
			printf("Invalid command: remove!\n");
			return -1;
		}

		// 发送命令
		tlv.type = RM;
		tlv.length = strlen(parameter);
		memcpy(tlv.value, parameter, tlv.length);
		send(sockfd, &tlv, sizeof(tlv.type) + sizeof(tlv.length) +
		     tlv.length, MSG_NOSIGNAL);

		// 接受标志
		recv(sockfd, &mark, sizeof(int), MSG_WAITALL);
		if (mark == -1) {
			printf("remove false\n");
			return -1;
		}
	}

	else if (strcmp(command, "puts") == 0) {

		// 如果puts后没有参数
		if (strlen(parameter) == 0) {
			printf("Invalid command: puts!\n");
			return -1;
		}

		// 发送命令
		tlv.type = PUTS;
		tlv.length = strlen(parameter);
		memcpy(tlv.value, parameter, tlv.length);
		send(sockfd, &tlv, sizeof(tlv.type) + sizeof(tlv.length) +
		     tlv.length, MSG_NOSIGNAL);


		//printf("command have send\n");


		puts_client(sockfd, parameter);

		// 接受标志
		recv(sockfd, &mark, sizeof(int), MSG_WAITALL);


		//printf("mark have recv\n");


		if (mark == -1) {
			printf("puts false!\n");
			return -1;
		}


		//printf("puts_client have done\n");


	}

	else if (strcmp(command, "gets") == 0) {

		// 如果gets后没有参数
		if (strlen(parameter) == 0) {
			printf("Invalid command: gets!\n");
			return -1;
		}

		// 发送命令
		tlv.type = GETS;
		tlv.length = strlen(parameter);
		memcpy(tlv.value, parameter, tlv.length);
		send(sockfd, &tlv, sizeof(tlv.type) + sizeof(tlv.length) +
		     tlv.length, MSG_NOSIGNAL);

		gets_client(sockfd, parameter);

		// 接受标志
		recv(sockfd, &mark, sizeof(int), MSG_WAITALL);
		if (mark == -1) {
			printf("gets false!\n");
			return -1;
		}
	}

	else if (strcmp(command, "logout") == 0) {

		close(sockfd);
		exit(-1);

	}

	else if (strcmp(command, "logoff") == 0) {

		// 验证密码
		char *tmp = getPassword("请输入密码：");
		if (strcmp(tmp, passwd) == 0) {

			// 发送命令
			tlv.type = ACCOUNTDELETE;
			tlv.length = strlen(parameter);
			send(sockfd, &tlv, sizeof(tlv.type) + sizeof(tlv.length) +
			     tlv.length, MSG_NOSIGNAL);

			// 接受标志
			recv(sockfd, &mark, sizeof(int), MSG_WAITALL);
			if (mark == -1) {
				printf("logoff false!\n");
				free(tmp); // 释放堆空间
				return -1;
			}
			printf("用户已删除！\n");
			exit(0);
		} else {
			printf("密码错误！\n");
		}
		free(tmp); // 释放堆空间

	} else {
		printf("command is not existence!\n");
		return -1;
	}

	return 0;
}
